package com.spring.redis.operation.service;

import com.spring.redis.operation.service.base.StringRedisBaseService;

import java.util.concurrent.TimeUnit;

/**
 * redis Operation string interface
 *
 * @author zhouyu
 */
public interface StringRedisService extends StringRedisBaseService {

    /**
     * 设置string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     * @param value value
     */
    void set(Class<?> clazz, String key, String value);

    /**
     * 设置string类型缓存
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param value     value
     */
    void set(String className, String key, String value);

    /**
     * 设置string类型缓存，并设置过期时间
     *
     * @param clazz   实体类
     * @param key     key
     * @param value   value
     * @param seconds 过期时间，为null不过期
     */
    void setEx(Class<?> clazz, String key, String value, Long seconds);

    /**
     * 设置string类型缓存，并设置过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param value     value
     * @param seconds   过期时间，为null不过期
     */
    void setEx(String className, String key, String value, Long seconds);

    /**
     * 获取string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     * @return java.lang.String
     */
    String get(Class<?> clazz, String key);

    /**
     * 获取string类型缓存
     *
     * @param className 自定义缓存
     * @param key       key
     * @return java.lang.String
     */
    String get(String className, String key);

    /**
     * 设置string key过期时间
     *
     * @param clazz   实体类
     * @param key     key
     * @param seconds 过期时间,单位秒
     */
    void expire(Class<?> clazz, String key, Long seconds);

    /**
     * 设置string key过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param seconds   过期时间,单位秒
     */
    void expire(String className, String key, Long seconds);

    /**
     * 设置string key过期时间
     *
     * @param className 自定义缓存
     * @param key       key
     * @param expire    自定义过期时间
     * @param timeUnit  自定义时间类型,为null默认单位为秒
     */
    void expire(String className, String key, Long expire, TimeUnit timeUnit);

    /**
     * 删除string类型缓存
     *
     * @param clazz 实体类
     * @param key   key
     */
    void del(Class<?> clazz, String key);

    /**
     * 删除string类型缓存
     *
     * @param className 自定义缓存
     * @param key       key
     */
    void del(String className, String key);

    /**
     * 删除String 类型指定key的缓存
     *
     * @param key key
     */
    void del(String key);

    /**
     * 自增
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自增值
     * @return java.lang.Long 自增后的值
     */
    Long increment(String className, String key, Long initNum, Long num);

    /**
     * 自增
     *
     * @param clazz   实体类
     * @param key     key
     * @param initNum 初始值
     * @param num     自增值
     * @return java.lang.Long 自增后的值
     */
    Long increment(Class<?> clazz, String key, Long initNum, Long num);

    /**
     * 获取自增值
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @return java.lang.Long 自增值
     */
    Long incrementValue(String className, String key);

    /**
     * 获取自增值
     *
     * @param clazz 实体类
     * @param key   key
     * @return java.lang.Long 自增值
     */
    Long incrementValue(Class<?> clazz, String key);

    /**
     * 自增值,并设置时效时间
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自增值
     * @param seconds   时效时间，单位秒
     * @return java.lang.Long 自增后的值
     */
    Long incrementExpire(String className, String key, Long initNum, Long num, Long seconds);

    /**
     * 自增值,并设置时效时间
     *
     * @param clazz   自定义缓存名称
     * @param key     key
     * @param initNum 初始值
     * @param num     自增值
     * @param seconds 时效时间，单位秒
     * @return java.lang.Long 自增后的值
     */
    Long incrementExpire(Class<?> clazz, String key, Long initNum, Long num, Long seconds);

    /**
     * 自减
     *
     * @param className 自定义缓存名称
     * @param key       key
     * @param initNum   初始值
     * @param num       自减值
     * @return java.lang.Long 自减后的值
     */
    Long decrement(String className, String key, Long initNum, Long num);

    /**
     * 自减
     *
     * @param clazz   实体类
     * @param key     key
     * @param initNum 初始值
     * @param num     自减值
     * @return java.lang.Long 自减后的值
     */
    Long decrement(Class<?> clazz, String key, Long initNum, Long num);

    /**
     * 判断key是否存在
     *
     * @param className 类名
     * @param key       key
     * @return java.lang.Boolean
     */
    Boolean hasKey(String className, String key);

    /**
     * 判断key是否存在
     *
     * @param clazz 类名
     * @param key   key
     * @return java.lang.Boolean
     */
    Boolean hasKey(Class<?> clazz, String key);
}
